/**
 * 模拟消砖块。
 * 对每一列维护一个当前高度，即可对每一次打击判断出是否应该消掉一块
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using Real = long double;
using llt = long long;
using vi  =vector<int>;
using pii = pair<int, int>;
using vvi = vector<vi>;
using vpii = vector<pii>;

vpii A;
int N, M;
int K;

void proc(){
    vi head(M + 1, 1);
    for(const auto & p : A){
        if(p.first >= head[p.second]){
            head[p.second] += 1;
        }
    }

    vector<string> borad(N+1, string(M+1, '.'));
    for(int i=1;i<=M;++i){
        for(int j=head[i];j<=N;++j){
            borad[j][i] = '*';
        }
    }
    for(int i=1;i<=N;++i){
        const auto & s = borad[i];
        cout << s.substr(1) << "\n";
    }
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> N >> M >> K;
        A.assign(K, {});
        for(auto & p : A) cin >> p.first >> p.second;
        proc();
    }
    return 0;
}